home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / c / stut_src / serial.c < prev    next >
Text File  |  1996-05-27  |  28KB  |  1,197 lines

  1. /*
  2.  * serial.c
  3.  *
  4.  * Purpose:
  5.  * --------
  6.  * Routines de traitement des ports s‚rie
  7.  *
  8.  * History:
  9.  * --------
  10.  * 1993: fplanque: Created
  11.  * 02.03.95: Adaptation Falcon
  12.  */
  13.  
  14.  
  15.      #include "!OPTIONS.H"                /* Options de compilation */         
  16.     #define    THIS_FILE    "SERIAL.C v1.11 - 03.95"
  17.  
  18.  
  19. /*
  20.  * System headers:
  21.  */
  22.     #include    <stdio.h>
  23.     #include    <stdlib.h>
  24.     #include    <string.h>                    /* strcpy() etc.. */
  25.     #include    <tos.h>                        /* Bconmap etc... */
  26.     #include    <aes.h>                        /* header AES */
  27.    
  28. /*
  29.  * Custom headers:
  30.  */
  31.     #include    "SPEC_PU.H"                    /* Macro MIN */
  32.     #include "S_MALLOC.H"
  33.     #include "STUT_ONE.RSC\STUT_3.H"                        /* noms des objets ds le ressource */
  34.     #include "POPUP_PU.H"                    /* Listes menu PopUp */
  35.     #include "EXFRM_PU.H"            
  36.     #include    "DEBUG_PU.H"    
  37.     #include    "SRIAL_PU.H"    
  38.     #include    "RTERR_PU.H"    
  39.     #include    "OBJCT_PU.H"    
  40.     #include    "FILES_PU.H"    
  41.     #include    "TERM_PU.H"    
  42.  
  43. /*
  44.  * ------------------------ PROTOTYPES -------------------------
  45.  */
  46.  
  47.  
  48. /*
  49.  * PRIVate INTernal prototypes:
  50.  */
  51.     static    void    param_term_initval(
  52.                             int device,                 /* In: No Bconmap du port concern‚ */
  53.                             char *ptext_bufin,         /* In: Ptr sur texte:Taille IN ds tedinfo concern‚e */
  54.                             char *ptext_bufout );    /* In: Ptr sur texte:Taille OUT ds tedinfo concern‚e */
  55.     static    void    param_term_saveval( 
  56.                 int device,                             /* In: No Bconmap du port concern‚ */
  57.                 char *ptext_bufin,                     /* In: Ptr sur texte:Taille IN ds tedinfo concern‚e */
  58.                 char *ptext_bufout );                /* In: Ptr sur texte:Taille OUT ds tedinfo concern‚e */
  59.     static    int    device_offset(                    /* Out: No d'ordre [0..n-1] du port */
  60.                              int device );                /* In:  No bconmap du port */
  61.     static    int    find_device_byabrev(         /* Out: no bconmap du p‚riph‚rique */
  62.                             char *abrev_string );    /* In:  abreviation du nom du port */
  63.     static    IOREC    *get_iorec(                        /* Out: Ptr sur IOREC demand‚e */
  64.                             int device );                /* In:  No bconmap du port dont on veut l'IOREC */
  65.     static    IOREC    *get_defiorec_cpy(            /* Out: Ptr sur IOREC demand‚e */
  66.                              int device );                /* In:  No bconmap du port dont on veut la copie d'IOREC */
  67.     static    void    install_newbuf( 
  68.                             int in_out,                 /* In: 0 pour buffer IN et 1 pour buffer out */
  69.                             int device,                 /* In: No bconmap du port concern‚ */
  70.                             int newsize );                /* In: Nlle taille … donner au buffer */
  71.  
  72.  
  73.    
  74. /*
  75.  * ------------------------ VARIABLES -------------------------
  76.  */
  77.     
  78.  
  79. /*
  80.  * PUBlic variables: 
  81.  */
  82.     int        G_term_dev = AUX;            /* Port utilis‚ par icone terminal ( Sur un STF sans Bconmap: 1,AUX ) */
  83.     long        *G_inst_abrev;                /* Noms abr‚g‚s en 4 lettres */
  84.     /* 
  85.      * Menu Pop-Up: 
  86.      */
  87.     POPUP_ENTRY* G_inst_drv_list;        /* Liste des p‚rifs install‚s pourmenu Popup */
  88.  
  89.     
  90. /*
  91.  * PRIVate variables: 
  92.  */
  93.     static    OBJECT    *    M_termconf_adr;            /* Boite de config terminal */
  94.     static    BCONMAP    *    M_bconmap = NULL;        /* Bconmap */
  95.     static    MAPTAB    *    M_def_maptab = NULL;    /* Adresse du MAPTAB par d‚faut */
  96.     static    int            M_def_nbserial = 1;        /* Nbre d'‚l‚ments du MAPTAB par d‚faut */
  97.     static    IOREC        *    M_def_iorecs_bak;        /* ParamŠtres par d‚faut */
  98.     static    char        *    M_serial_names[]=        /* Ports s‚rie pouvant exister */
  99.                                 {
  100.                                     "  Modem 1",
  101.                                     "  Modem 2",
  102.                                     "  Serial 1",
  103.                                     "  Serial 2",
  104.                                     "  Extra "
  105.                                 };        
  106.     static    long            M_serial_abrev[]=            /* Abr‚viations utilis‚es pour les ports s‚rie */
  107.                                 {
  108.                                     'MOD1',
  109.                                     'MOD2',
  110.                                     'SER1',
  111.                                     'SER2',
  112.                                     'EXTR'
  113.                                 };
  114.     static    char        *    M_bufsize_filefmt = "BSIZIN=%d,BSIZOUT=%d";
  115.     static    long            rsconf_baudrates[] =
  116.                                 { 19200, 9600, 4800, 3600, 2400, 2000, 1800, 1200,
  117.                                600, 300, 200, 150, 134, 110, 75, 50, 0 };
  118.      
  119. /*
  120.  * ------------------------ FUNCTIONS -------------------------
  121.  */
  122.  
  123.  
  124. /*
  125.  * init_serial(-)
  126.  *
  127.  * Purpose:
  128.  * --------
  129.  * Init des prises s‚rie et des boŒtes de configuration
  130.  *
  131.  * Suggest:
  132.  * --------
  133.  * La d‚tection de support Bconmap doit ˆtre chang‚e:
  134.  * Detecter le type de BIOS avant d'appeller Bconmap.
  135.  *
  136.  * Notes:
  137.  * ------
  138.  * Sur Falcon, Bconmap retourne 7, mais on ne peut pas adresser le port 7,
  139.  * il faut passer par AUX.
  140.  *
  141.  * History:
  142.  * --------
  143.  * fplanque: Created
  144.  * 11.05.94: fplanque: Ajout‚ test de validit‚ suppl‚mentaire pour le
  145.  *                                premier appel Bconmap
  146.  * 02.03.95: Changement lors de la cr‚ation de la liste des ports
  147.  * 14.03.95: utilise toujours AUX si un seul port s‚rie
  148.  */
  149. void    init_serial( void )
  150. {
  151.     /* 
  152.      * Variables: 
  153.      */
  154.     long    bconmap;
  155.     int    i;
  156.     IOREC    *iorec, *iorec_ptr;
  157.  
  158.     TRACE0( "Initializing " THIS_FILE );
  159.  
  160.     /*
  161.      * Init RSC: 
  162.      */
  163.     if ( rsrc_gaddr( R_TREE, TERMCONF, &M_termconf_adr ) == 0 )
  164.     {
  165.         erreur_rsrc();
  166.     }
  167.     rsrc_color( M_termconf_adr );        /* Fixe couleurs */
  168.  
  169.     /*
  170.      * Prises s‚rie: 
  171.      * Demande p‚riph‚rique par d‚faut:
  172.      */
  173.     bconmap = Bconmap( -1 );            
  174.     TRACE1( "Bconmap returns def port as %ld", bconmap );
  175.     
  176.     if( bconmap >= 6  && bconmap != 44 && bconmap <= 800 )
  177.     {    /* 
  178.          * Si la fonction est reconnue par le XBIOS: 
  179.          * Non reconnu devrait normalement se traduire par retour de 44
  180.          * Mais le STF de fplanque TOS 1.4 renvoie un nombre dans les milliers
  181.          * D'ou test si - de 800
  182.          */
  183.  
  184.         /*
  185.          * Port utilis‚ par ic“ne terminal = port par d‚faut:
  186.          */
  187.         G_term_dev = (int) bconmap;    
  188.         
  189.         /*
  190.          * Demande adresse bconmap: 
  191.          */
  192.         bconmap = Bconmap( -2 );
  193.         M_bconmap = (BCONMAP *) bconmap;
  194.         M_def_maptab = M_bconmap -> maptab;        /* Tableau des ports */
  195.         M_def_nbserial = M_bconmap -> maptabsize;    /* Nbre d'‚l‚ments */
  196.     
  197.     }        /* Fin d'utilisation de Bconmap */
  198.  
  199.     TRACE1( " Nb of serial ports: %d", M_def_nbserial );
  200.         
  201.     /* 
  202.      * Cr‚e une liste des ports s‚rie disponibles: 
  203.      */
  204.     G_inst_drv_list = (POPUP_ENTRY *)MALLOC( sizeof( POPUP_ENTRY ) * (M_def_nbserial +1) );
  205.     G_inst_abrev     = (long *)     MALLOC( sizeof( long )   * M_def_nbserial );
  206.  
  207.     if( M_def_nbserial == 1 )
  208.     {    /*
  209.          * 1 seule prise s‚rie (STF,STE,Falcon): 
  210.          * chged on 02.03.95
  211.          */
  212.         if( G_term_dev >= MOD1 )
  213.         {    /*
  214.              * Falcon par exemple, STF/STE avec nouveau TOS (?):
  215.              * On se force … utiliser AUX plutot qu'un driver sp‚cifique,
  216.              * c'est plus sur.
  217.              */
  218.             G_inst_drv_list[ 0 ] .name = M_serial_names[ G_term_dev -6 ];    /* Modem 1 */
  219.             G_inst_abrev[ 0 ]     = M_serial_abrev[ G_term_dev -6 ];    /* Modem 1 */
  220.             G_term_dev = AUX;
  221.         }
  222.         else
  223.         {    /*
  224.              * STF,STE:
  225.              */
  226.             G_inst_drv_list[ 0 ] .name = M_serial_names[ MOD1 -6 ];    /* Modem 1 */
  227.             G_inst_abrev[ 0 ]     = M_serial_abrev[ MOD1 -6 ];    /* Modem 1 */
  228.         }
  229.         G_inst_drv_list[ 0 ] .value = G_term_dev;        /* AUX */
  230.     }
  231.     else if( M_def_nbserial == 3 )
  232.     {    /*
  233.           * 3 prises s‚rie (M‚ga STE?): 
  234.           */
  235.         G_inst_drv_list[ 0 ] .name = M_serial_names[ MOD1 -6 ];    /* Modem 1 */
  236.         G_inst_drv_list[ 0 ] .value = MOD1;            /* Modem 1 */
  237.         G_inst_abrev[ 0 ]     = M_serial_abrev[ MOD1 -6 ];    /* Modem 1 */
  238.  
  239.         G_inst_drv_list[ 1 ] .name  = M_serial_names[ MOD2 -6 ];    /* Modem 2 */
  240.         G_inst_drv_list[ 1 ] .value = MOD2;                                /* Modem 2 */
  241.         G_inst_abrev[ 1 ]     = M_serial_abrev[ MOD2 -6 ];
  242.  
  243.         G_inst_drv_list[ 2 ]    .name     = M_serial_names[ SER2 -6 ];    /* Serial 2 */
  244.         G_inst_drv_list[ 2 ]    .value = SERL;                                /* Serial 2 Mega STE */
  245.         G_inst_abrev[ 2 ]     = M_serial_abrev[ SER2 -6 ];
  246.     }
  247.     else
  248.     {    /*
  249.          * PROVISOIRE: (TT?, Carte?) Plusieurs prises s‚rie: 
  250.          */
  251.         for( i=0; i<=3; i++ )
  252.         {
  253.             G_inst_drv_list[ i ] .name  = M_serial_names[ i ];        /* Autres prises */
  254.             G_inst_drv_list[ i ]    .value = 6+i;
  255.             G_inst_abrev[ i ]     = M_serial_abrev[ i ];
  256.         }
  257.         /*
  258.          * S'il y en a encore: 
  259.          */
  260.         if ( M_def_nbserial > 4 )
  261.         {    /*
  262.              * Installation des Extra-Ports 
  263.              */
  264.             for( ; i<M_def_nbserial; i++ )
  265.             {
  266.                 G_inst_drv_list[ i ] .name  = M_serial_names[ 4 ];    /* Extra Ports */                
  267.                 G_inst_drv_list[ i ] .value = 6+i;
  268.                 G_inst_abrev[ i ]     = M_serial_abrev[ 4 ];
  269.             }
  270.         }
  271.     }
  272.     /*
  273.      * Termine la liste par une r‚f‚rence nulle: 
  274.      */
  275.     G_inst_drv_list[ M_def_nbserial ] .name = NULL;
  276.  
  277.     /* 
  278.      * Sauve params BUFFERS par d‚faut: 
  279.      */
  280.     M_def_iorecs_bak = MALLOC( sizeof( IOREC ) * 2 * M_def_nbserial );
  281.     iorec_ptr = M_def_iorecs_bak;
  282.     for( i = 0; i < M_def_nbserial; i++ )
  283.     {
  284.         /*
  285.          * Adresse BUFFER IN: 
  286.          */
  287.         iorec = get_iorec( G_inst_drv_list[ i ] .value );
  288.         /*
  289.          * Copie des donn‚es: 
  290.          */
  291.         iorec_ptr -> ibuf        = iorec -> ibuf;
  292.         iorec_ptr -> ibufsiz    = iorec -> ibufsiz;
  293.         iorec_ptr -> ibuflow    = iorec -> ibuflow;
  294.         iorec_ptr -> ibufhi    = iorec -> ibufhi;
  295.         /*
  296.          * Passe … emplacement de sauvegarde suivant: 
  297.          */
  298.         iorec_ptr++;
  299.  
  300.         /*
  301.          * Adresse BUFFER OUT: 
  302.          */
  303.         iorec ++;
  304.         /*
  305.          * Copie des donn‚es: 
  306.          */
  307.         iorec_ptr -> ibuf        = iorec -> ibuf;
  308.         iorec_ptr -> ibufsiz    = iorec -> ibufsiz;
  309.         iorec_ptr -> ibuflow    = iorec -> ibuflow;
  310.         iorec_ptr -> ibufhi    = iorec -> ibufhi;
  311.         /*
  312.          * Passe … emplacement de sauvegarde suivant: 
  313.          */
  314.         iorec_ptr++;
  315.  
  316.     }
  317.  
  318.     /*
  319.      * Maintenant que les ports s‚rie sont recens‚s...
  320.      *
  321.      * On initialise les vitesses:
  322.      * -le port de l'ic“ne TERMINAL est initialis‚ … 4800 bps
  323.      *  et on suppose qu'il y a un minitel au bout qu'on va initialiser
  324.      *  par la mˆme occasion
  325.      */
  326.     init_MinitelPort( G_term_dev );
  327.  
  328. }
  329.  
  330.  
  331.  
  332. /*
  333.  * SetPort(-)
  334.  *
  335.  * Purpose:
  336.  * --------
  337.  * Configuration d'un port s‚rie
  338.  *
  339.  * History:
  340.  * --------
  341.  * 30.09.94: fplanque: created
  342.  */
  343. void    SetPort(
  344.             int        n_devno,                /* In: Port … utiliser, ex AUX */
  345.             long        l_baud_rate,        /* In: Vitesse: ex: 9600 */
  346.             char        c_parity,            /* In: Parit‚: 'E' 'O' ou 'N' */
  347.             int        n_word_length,        /* In: Longueur de car: 5, 6, 7 ou 8 */
  348.             int        n_mode,                /* In: Mode: ex: MODE_ASYNC1STOP */
  349.             int        n_handshake )        /* In: Handshake: ex: HANDSHAKE_NONE */
  350. {
  351.     int    n_bpsIndex;
  352.     int    n_ctr = 0x00;
  353.     int    n_ucr    = 0x80;
  354.     
  355.     /*
  356.      * Cherche index correspondant au d‚bit souhait‚:
  357.      */
  358.     for( n_bpsIndex = 0; rsconf_baudrates[ n_bpsIndex ] != 0; n_bpsIndex++ )
  359.     {    
  360.         if( rsconf_baudrates[ n_bpsIndex ] == l_baud_rate )
  361.         {
  362.             break;
  363.         }
  364.     }
  365.  
  366.  
  367.     /*
  368.      * parit‚:
  369.      */
  370.     switch( c_parity )
  371.     {
  372.         case    'e':
  373.         case    'E':
  374.             n_ucr |= PARITY_EVEN;
  375.             break;
  376.             
  377.         case    'o':
  378.         case    'O':
  379.             n_ucr |= PARITY_ODD;
  380.  
  381.         /* Default: NONE */
  382.     }
  383.  
  384.  
  385.     /*
  386.      * Longueur des octets:
  387.      */
  388.     switch( n_word_length )
  389.     {
  390.         case    7:
  391.             n_ucr |= BITS_7;
  392.             break;
  393.             
  394.         case    6:
  395.             n_ucr |= BITS_6;
  396.             break;
  397.             
  398.         case    5:
  399.             n_ucr |= BITS_5;
  400.             break;
  401.             
  402.         /* default: 8 */
  403.     }
  404.     
  405.  
  406.     /*
  407.      * Mode
  408.      * (sync/ nb of stop bits )
  409.      */
  410.     n_ucr |= n_mode;
  411.  
  412.  
  413.     /*
  414.      * Handshake:
  415.      */
  416.     n_ctr = n_handshake;
  417.  
  418.  
  419.     /*
  420.      * S‚lectionne le port … configurer:
  421.      */
  422.     if( n_devno >= MOD1 )
  423.     {    /*
  424.          * S'il s'agit d'un port ‚tendu:
  425.          */
  426.         Bconmap( n_devno );
  427.         if( Bconmap( -1 ) != n_devno )
  428.         {    /*
  429.              * Si la s‚lection n'a pas ‚t‚ prise en compte:
  430.              */
  431.             signale( "s‚lection port impossible!" );
  432.             return;
  433.         }
  434.     }
  435.  
  436.     /*
  437.      * Configuration effective:
  438.      */
  439.     Rsconf( n_bpsIndex, n_ctr, n_ucr, -1, -1, -1 );
  440.  
  441.     /*
  442.      * 10 centiŠmes de secs de pause:
  443.      */
  444.     wait( 10 );
  445.  
  446. }
  447.  
  448.  
  449. /*
  450.  * restore_serial(-)
  451.  *
  452.  * Purpose:
  453.  * --------
  454.  * Restauration des buffers s‚rie par d‚faut(:… l'appel de l'appli)
  455.  * lorsque l'on quitte par exemple.
  456.  *
  457.  * History:
  458.  * --------
  459.  * 1993: fplanque: Created
  460.  * 02.03.95: modified loop method
  461.  */
  462. void    restore_serial( void )
  463. {
  464.     IOREC    *iorec_cpy;
  465.     int i;
  466.     int    device;
  467.     
  468.     for( i=0; i<M_def_nbserial; i++ )
  469.     {
  470.         device = G_inst_drv_list[ i ] .value;
  471.  
  472.         /*
  473.          * Adresse Buffer IN: 
  474.          */
  475.         iorec_cpy = get_defiorec_cpy( device );
  476.     
  477.         /*
  478.          * Restore buffers: 
  479.          */
  480.         install_newbuf( 0, device, iorec_cpy[0] .ibufsiz );    /* Installe nouveau buffer Entr‚e */
  481.         install_newbuf( 1, device, iorec_cpy[1] .ibufsiz );    /* Installe nouveau buffer Sortie */
  482.     }
  483. }
  484.  
  485.  
  486.  
  487. /*
  488.  * ---------------- GESTION PORTS SERIE DS FICHIER .INI -----------------
  489.  */
  490.  
  491.  
  492.  
  493. /*
  494.  * save_serial_ini(-)
  495.  *
  496.  * Purpose:
  497.  * --------
  498.  * Sauve paramŠtres des ports s‚rie dans fichier INI
  499.  *
  500.  * History:
  501.  * --------
  502.  * 1993: fplanque: Created
  503.  * 02.03.95:
  504.  */
  505. void    save_serial_ini( 
  506.             FILE *fstream )        /* In: Ptr sur fichier dans lequel on doit sauver */
  507. {
  508.     /*
  509.      * Variables: 
  510.      */
  511.     int        offset;
  512.     IOREC    *    iorec;            /* Iorec du port courant */
  513.  
  514.     /*
  515.      * Signale qu'on s'int‚resse ici aux paramŠtres s‚rie: 
  516.      */
  517.     fputs( "\r\n[ Ports s‚rie: ]\r\n\r\n", fstream );        /* Commentaire */
  518.  
  519.     /*
  520.      * Parcourt les ports: 
  521.      */
  522.     for( offset=0; offset<M_def_nbserial; offset++ )
  523.     {
  524.         /*
  525.          * Nom abr‚g‚ du port d‚sign‚: 
  526.          */
  527.         fputs( "PORT ", fstream );
  528.         fwrite( &G_inst_abrev[ offset ], sizeof( long ), 1, fstream  );
  529.         fputc( ':', fstream );
  530.         
  531.         /*
  532.          * Taille des buffers: 
  533.          */
  534.         iorec = get_iorec( G_inst_drv_list[ offset ] .value );        /* Adr zone d'infos (iorec) */
  535.         fprintf( fstream, M_bufsize_filefmt, iorec[0] .ibufsiz, iorec[1] .ibufsiz );
  536.  
  537.         /*
  538.          * Commentaire de fin de ligne: 
  539.          */
  540.         fprintf( fstream, "   !%s\r\n", G_inst_drv_list[ offset ] .name +1 );    /* +1: saute 1 espace */
  541.     }
  542. }
  543.  
  544.  
  545. /*
  546.  * serial_ini(-)
  547.  *
  548.  * Purpose:
  549.  * --------
  550.  * Fixe paramŠtres des ports s‚rie 
  551.  * en utilisant les informations lues dans fichier INI
  552.  *
  553.  * Suggest:
  554.  * --------
  555.  * Modifier les messages d'erreurs, ne pas les afficher sur l'‚cran
  556.  *
  557.  * History:
  558.  * --------
  559.  * 1993: fplanque: Created
  560.  * 18.05.94: fplanque: Ajout‚ messages d'erreur
  561.  */
  562. void    serial_ini( 
  563.             char *object,            /* In: Objet concern‚ (Tete de Ligne lue ds fichier .INI), ici un poet s‚rie */
  564.             char *data )            /* In: Donn‚es associ‚es … l'objet, ici taille des buffers */
  565. {
  566.     int    device;                    /* P‚rif concern‚ */
  567.     int    bsizein, bsizeout;    /* Taille des buffers demand‚e */
  568.  
  569.     if ( object == NULL )
  570.     {
  571.         signale("Ligne non valide");
  572.     }
  573.     else
  574.     {
  575.         /*
  576.          * Cherche port concern‚: 
  577.          */
  578.         device = find_device_byabrev( object );            
  579.  
  580.         if ( device == NIL )
  581.         {
  582.             signale( "PORT Init: Port n'existe pas!" );
  583.         }
  584.         else
  585.         {    /*
  586.              * Si on a trouv‚ le p‚rif: 
  587.              */
  588.         
  589.             /*
  590.              * D‚termine taille des buffers demand‚s par fichier INI: 
  591.              */
  592.             sscanf( data, M_bufsize_filefmt, &bsizein, &bsizeout );
  593.             /* printf(" >Tailles IN=%d, OUT=%d\n", bsizein, bsizeout ); */
  594.  
  595.             /*
  596.              * Installe nouveaux buffers de la taille demand‚e: 
  597.              */
  598.             install_newbuf( 0, device, bsizein );    /* Installe nouveau buffer Entr‚e */
  599.             install_newbuf( 1, device, bsizeout );    /* Installe nouveau buffer Sortie */
  600.         }
  601.     }
  602. }
  603.  
  604.  
  605.  
  606.  
  607. /*
  608.  * --------------------- PARAM PAR L'UTILISATEUR ------------------------
  609.  */
  610.  
  611.  
  612.  
  613. /*
  614.  * param_term(-)
  615.  *
  616.  * Purpose:
  617.  * --------
  618.  * Param‚trage par l'utilisateur
  619.  * d'un port s‚rie pour terminal
  620.  *
  621.  * History:
  622.  * --------
  623.  * 1993: fplanque: Created
  624.  */
  625. void param_term( 
  626.             const GRECT *start_box )    /* In: Rectangle de d‚part de l'effet graphique d'ouverture */
  627. {
  628.     int        exit_obj;                    /* Objet de sortie */
  629.     GRECT        form_box;                    /* Dimensions du formulaire */
  630.     int        edit = BUFOUT;                /* Objet en cours d'‚dition */
  631.     char        *ptext_bufin = (M_termconf_adr[ BUFIN ] .ob_spec.tedinfo) -> te_ptext;
  632.     char        *ptext_bufout = (M_termconf_adr[ BUFOUT ] .ob_spec.tedinfo) -> te_ptext;
  633.     int        curr_device = G_term_dev;    /* P‚riph courant */
  634.  
  635.     /*
  636.      * Initialise les valeurs dans la boŒte: 
  637.      */
  638.     param_term_initval( curr_device, ptext_bufin, ptext_bufout );
  639.  
  640.     /*
  641.      * Gestion boŒte dialogue: 
  642.      */
  643.     /* App prend en charge souris */
  644.     WIND_UPDATE_BEG_MCTRL
  645.     open_dialog( M_termconf_adr, start_box, &form_box );
  646.     
  647.     do
  648.     {
  649.         exit_obj=ext_form_do( M_termconf_adr, &edit);    /* Gestion de la boŒte */
  650.         switch( exit_obj )
  651.         {
  652.             case    PORT:
  653.             case    PORTUP:
  654.             {    /*
  655.                  * S‚lection du port utilis‚: 
  656.                  */
  657.                 int    selected;        /* Ligne s‚lectionn‚e */
  658.                 int    new_device;        /* Nouveau port serie s‚lectionn‚ */
  659.                 
  660.                 /*
  661.                  * Appelle le Pop-Up: 
  662.                  */
  663.                 selected = popup_inform( M_termconf_adr, exit_obj, PORT, G_inst_drv_list, curr_device );
  664.             
  665.                 /* 
  666.                  * V‚rifie si la s‚lection est valide: 
  667.                  */
  668.                 if ( selected != ABORT_2 )
  669.                 {    /* 
  670.                      * Si valide: 
  671.                      * Conversion No de ligne -> no de port: 
  672.                      */
  673.                     new_device = selected;
  674.                     
  675.                     /* V‚rifie qu'elle est diff‚rente de l'actuelle: */
  676.                     if ( new_device != curr_device )
  677.                     {    /*
  678.                          * On a choisi un nouveau port s‚rie: 
  679.                          * Nouveau port s‚lectionn‚: 
  680.                          */
  681.                         curr_device = new_device;
  682.  
  683.                         /* Fixe les nlles valeurs des buffers ds le formulaire: */
  684.                         param_term_initval( curr_device, ptext_bufin, ptext_bufout );
  685.  
  686.                         /* R‚affiche les zones ayant chang‚: */
  687.                         objc_draw( M_termconf_adr, PORT, 1, form_box .g_x,
  688.                               form_box .g_y, form_box .g_w, form_box .g_h );
  689.                         objc_draw( M_termconf_adr, BUFIN, 1, form_box .g_x,
  690.                               form_box .g_y, form_box .g_w, form_box .g_h );
  691.                         objc_draw( M_termconf_adr, BUFOUT, 1, form_box .g_x,
  692.                               form_box .g_y, form_box .g_w, form_box .g_h );
  693.                     }
  694.                 }
  695.                 
  696.                 /*
  697.                  * Change csr souris en flŠche: 
  698.                  */
  699.                 graf_mouse( ARROW, NULL );
  700.                 break;
  701.             }
  702.         }
  703.  
  704.     } while ( exit_obj != PTERMVAL && exit_obj != PTERMANN );
  705.  
  706.     close_dialog( M_termconf_adr, exit_obj, start_box, &form_box );
  707.     /* AES peut reprendre la souris */
  708.     WIND_UPDATE_END_MCTRL
  709.  
  710.     /*
  711.      * Teste s'il y a eu confirmation: 
  712.      */
  713.     if ( exit_obj == PTERMVAL )
  714.     {
  715.         /* Change la taille des buffers en fonctions des valeurs demand‚es: */
  716.         param_term_saveval( curr_device, ptext_bufin, ptext_bufout );
  717.  
  718.         /* Fixe nouveau port terminal: */
  719.         G_term_dev = curr_device;
  720.     }
  721. }
  722.  
  723.  
  724.  
  725. /*
  726.  * param_term_initval(-)
  727.  *
  728.  * Purpose:
  729.  * --------
  730.  * Init des valeurs concernant UN port dans le dialogue
  731.  * de configuration des ports
  732.  *
  733.  * History:
  734.  * --------
  735.  * 1993: fplanque: Created
  736.  */
  737. void    param_term_initval(
  738.             int device,                 /* In: No Bconmap du port concern‚ */
  739.             char *ptext_bufin,         /* In: Ptr sur texte:Taille IN ds tedinfo concern‚e */
  740.             char *ptext_bufout )        /* In: Ptr sur texte:Taille OUT ds tedinfo concern‚e */
  741. {
  742.     /*
  743.      * Variables: 
  744.      */
  745.     IOREC        *iorec_in;                    /* Structure Iorec du tampon IN courant */
  746.     int        bufsize_in;                    /* Taille du tampon d'entr‚e */    
  747.     IOREC        *iorec_out;                    /* Structure Iorec du tampon OUT courant */
  748.     int        bufsize_out;                /* Taille du tampon de sortie */    
  749.  
  750.     /*
  751.      * D‚termine taille des tampons: 
  752.      */
  753.     iorec_in = get_iorec( device );
  754.     bufsize_in = iorec_in -> ibufsiz;        /* Taille du tampon d'entr‚e */
  755.     iorec_out = &iorec_in[1];
  756.     bufsize_out = iorec_out -> ibufsiz;        /* Taille du tampon de sortie */
  757.  
  758.     /*
  759.      * Fixe cette taille dans le formulaire: 
  760.      */
  761.     itoa( bufsize_in, ptext_bufin, 10 );        /* Conversion base 10 */
  762.     itoa( bufsize_out, ptext_bufout, 10 );        /* Conversion base 10 */
  763.  
  764.     /* 
  765.      * Fixe nom du port dans le formulaire: 
  766.      */
  767.     fix_popup_title( &M_termconf_adr[ PORT ], G_inst_drv_list, device );
  768. }
  769.  
  770.  
  771.  
  772. /*
  773.  * param_term_saveval(-)
  774.  *
  775.  * Purpose:
  776.  * --------
  777.  * Sauve les valeurs entr‚e pour UN port
  778.  * dans le dialogue de configuration des ports s‚rie
  779.  *
  780.  * History:
  781.  * --------
  782.  * 1993: fplanque: Created
  783.  */
  784. void    param_term_saveval( 
  785.             int device,                 /* In: No Bconmap du port concern‚ */
  786.             char *ptext_bufin,         /* In: Ptr sur texte:Taille IN ds tedinfo concern‚e */
  787.             char *ptext_bufout )        /* In: Ptr sur texte:Taille OUT ds tedinfo concern‚e */
  788. {
  789.     /*
  790.      * Variables: 
  791.      */
  792.     int        newsize_in;
  793.     int        newsize_out;
  794.     
  795.     /*
  796.      * R‚cupŠre taille des buffers: 
  797.      */
  798.     newsize_in = (int) MIN( atol( ptext_bufin ), 32000 );    /* Taille demand‚e en entr‚e */
  799.     newsize_out = (int) MIN( atol( ptext_bufout ), 32000 );    /* Taille demand‚e en sortie */
  800.  
  801.     /*
  802.      * Installe nouveaux buffers: 
  803.      */
  804.     install_newbuf( 0, device, newsize_in );    /* Installe nouveau buffer Entr‚e */
  805.     install_newbuf( 1, device, newsize_out );    /* Installe nouveau buffer Sortie */
  806.  
  807. }
  808.  
  809.  
  810.  
  811. /*
  812.  * ----------- REPRESENTATION DES DIFFERENTS PORTS EN MEMOIRE -----------
  813.  */
  814.  
  815.  
  816.  
  817. /*
  818.  * device_offset(-)
  819.  *
  820.  * Purpose:
  821.  * --------
  822.  * D‚termine offset dans Maptab ou ds G_inst_drv_list 
  823.  * d'un port d'aprŠs son no bconmap
  824.  *
  825.  * History:
  826.  * --------
  827.  * 1993: fplanque: Created
  828.  */
  829. int    device_offset(        /* Out: No d'ordre [0..n-1] du port */
  830.              int device )    /* In: No bconmap du port */
  831. {
  832.     int    i;
  833.         
  834.     /*
  835.      * Parcourt la liste des ports disponibles: 
  836.      */
  837.     for( i=0; i<M_def_nbserial; i++ )
  838.     {
  839.         if( G_inst_drv_list[ i ] .value == device )
  840.         {    /* 
  841.              * Si on a trouv‚ le port qui nous int‚resse: 
  842.              */
  843.             return    i;            /* Retourne offset */
  844.         }
  845.     }
  846.  
  847.     /*
  848.      * Si on a pas trouv‚: ANORMAL 
  849.      */
  850.     ping();
  851.     TRACE1( "GetDevOffset: Port s‚rie %d inconnu", device );
  852.  
  853.     return    0;
  854. }
  855.  
  856.  
  857.  
  858. /*
  859.  * find_device_byabrev(-)
  860.  *
  861.  * Purpose:
  862.  * --------
  863.  * Trouve un no de p‚riph‚rique
  864.  * en fonction de l'abr‚viation de son nom
  865.  *
  866.  * History:
  867.  * --------
  868.  * 1993: fplanque: Created
  869.  * 02.03.95: ComplŠtement remodel‚
  870.  */
  871. int    find_device_byabrev(         /* Out: no bconmap du p‚riph‚rique */
  872.                 char *abrev_string )    /* In:  abreviation du nom du port */
  873. {
  874.     long    abrev;        /* Abreviation du p‚riph‚rique */
  875.     int    offset;        /* Offset du port ds liste */
  876.  
  877.     /*
  878.      * Cr‚e un Long Int contenant le codename du port: 
  879.      */
  880.     abrev = ( ((unsigned long)abrev_string[0]) <<24) 
  881.             | ( ((unsigned long)abrev_string[1]) <<16)
  882.             | ( ((unsigned long)abrev_string[2]) <<8)
  883.             | ( (unsigned long)abrev_string[3]);
  884.  
  885.     /*
  886.      * Cherche le port concern‚: 
  887.      */
  888.     for( offset=0; offset<M_def_nbserial; offset++ )
  889.     {
  890.         /*
  891.          * Compare Nom abr‚g‚ du port d‚sign‚: 
  892.          */
  893.         if( G_inst_abrev[ offset ] == abrev )
  894.         {    /*
  895.              * On a trouv‚ le port: 
  896.              */
  897.             return    G_inst_drv_list[ offset ] .value;
  898.         }
  899.     }
  900.         
  901.     /*
  902.      * On a pas trouv‚: 
  903.      */
  904.     return    NIL;
  905. }
  906.  
  907.  
  908.  
  909. /*
  910.  * ----------- MANIPULATION DES BUFFERS IN/OUT DES PORTS SERIE ------------
  911.  */
  912.  
  913.  
  914. /*
  915.  * get_iorec(-)
  916.  *
  917.  * Purpose:
  918.  * --------
  919.  * D‚termine adresse de la zone IOREC de n'importe quel port s‚rie
  920.  *
  921.  * Notes:
  922.  * ------
  923.  * La zone gŠre le buffer d'un port
  924.  *
  925.  * History:
  926.  * --------
  927.  * 1993: fplanque: Created
  928.  * 02.03.95: calls device_offset()
  929.  */
  930. IOREC    *    get_iorec(            /* Out: Ptr sur IOREC demand‚e */
  931.              int device )        /* In: No bconmap du port dont on veut l'IOREC */
  932. {
  933.     /*
  934.      * Selon qu'il s'agit d'un port ‚tendu ou un port standard: 
  935.      */
  936.     if ( device >= 6  &&  M_def_maptab != NULL )
  937.     {    /* 
  938.          * S'il existe une table: 
  939.          */
  940.         return    M_def_maptab[ device_offset(device) ] .iorec;
  941.     }
  942.     else
  943.     {    /*
  944.          * Par defaut on donne le resultat pour le dev 1(AUX): 
  945.          */
  946.         return    Iorec( 0 );            /* Donne Iorec RS232 */
  947.     }
  948. }
  949.  
  950.  
  951.  
  952. /*
  953.  * get_defiorec_cpy(-)
  954.  *
  955.  * Purpose:
  956.  * --------
  957.  * D‚termine adresse de la copie d'IOREC d'origine d'un port s‚rie
  958.  *
  959.  * History:
  960.  * --------
  961.  * 1993: fplanque: Created
  962.  * 02.03.95: calls device_offset()
  963.  */
  964. IOREC    *get_defiorec_cpy(    /* Out: Ptr sur IOREC demand‚e */
  965.              int device )        /* In: No bconmap du port dont on veut la copie d'IOREC */
  966. {
  967.     /*
  968.      * Selon qu'il s'agit d'un port ‚tendu ou un port standard: 
  969.      */
  970.     if ( device >= 6  &&  M_def_maptab != NULL )
  971.     {    /* 
  972.          * S'il existe une table: 
  973.          */
  974.         return    &M_def_iorecs_bak[ device_offset(device) *2 ];
  975.     }
  976.     else
  977.     {    /*
  978.          * Par defaut on donne le resultat pour le dev 1(AUX): 
  979.          */
  980.         return    M_def_iorecs_bak;            /* Donne Iorec RS232 */
  981.     }
  982. }
  983.  
  984.  
  985.  
  986. /*
  987.  * install_newbuf(-)
  988.  *
  989.  * Purpose:
  990.  * --------
  991.  * Installe un nouveau buffer pour un port s‚rie
  992.  *
  993.  * Algo:
  994.  * ----
  995.  * Attend que le buffer OUT soit vide avant de le modifier
  996.  *
  997.  * History:
  998.  * --------
  999.  * 1993: fplanque: Created
  1000.  */
  1001. void    install_newbuf( 
  1002.             int in_out,         /* In: 0 pour buffer IN et 1 pour buffer out */
  1003.             int device,         /* In: No bconmap du port concern‚ */
  1004.             int newsize )        /* In: Nlle taille … donner au buffer */
  1005. {
  1006.     IOREC    *    iorec = &(get_iorec( device ))[ in_out ];
  1007.     int        oldsize = iorec -> ibufsiz;    /* Ancienne Taille */
  1008.  
  1009.     /* printf("%d: %d->%d ",device,oldsize,newsize); */
  1010.  
  1011.     /*
  1012.      * Teste si la taille … chang‚: 
  1013.      */
  1014.     if ( oldsize != newsize )
  1015.     {
  1016.         /*
  1017.          * Variables: 
  1018.          */
  1019.         void    *old_buffer = iorec -> ibuf;    /* Buffer actuel */
  1020.         void    *new_buffer;
  1021.         /*
  1022.          * Trouve adresse de la copie d'Iorec par d‚faut: 
  1023.          */
  1024.         IOREC    *def_iorec = &(get_defiorec_cpy( device ))[ in_out ];
  1025.         /*
  1026.          * Taille par defaut: 
  1027.          */
  1028.         int    defsize = def_iorec -> ibufsiz;
  1029.  
  1030.         /*
  1031.          * Verifie s'il faut cr‚er un nouveau buffer: 
  1032.          */
  1033.         if( newsize > defsize )
  1034.         {    /*
  1035.              * Il faut cr‚er un nouveau buffer: 
  1036.              */
  1037.             new_buffer = MALLOC( newsize );
  1038.             if( new_buffer == NULL )
  1039.             {
  1040.                 alert( NOMEM_NEWBUF );    /* Pas assez de m‚moire pour nouveau buffer */
  1041.             }
  1042.             TRACE1(" New Buffer:%lX", new_buffer );
  1043.         }
  1044.         else
  1045.         {    /*
  1046.              * Si le buffer standard suffit: 
  1047.              */
  1048.             new_buffer = def_iorec -> ibuf;
  1049.         }
  1050.  
  1051.  
  1052.         /*
  1053.          * S'il s'agit d'un buffer de sortie:
  1054.          */
  1055.         if( in_out == 1 )
  1056.         {    /*
  1057.              * On attend que ce buffer soit vide:
  1058.              */ 
  1059.             /* TRACE0( "Attend que le buffer sortie soit vide" ); */
  1060.  
  1061.             while( iorec -> ibuftl != iorec -> ibufhd )
  1062.                 ;
  1063.  
  1064.             /* TRACE0( "Buffer vide: r‚allocation" );                */
  1065.         }
  1066.  
  1067.  
  1068.         /*
  1069.          * V‚rifie si l'adresse du nouveau buffer est valide: 
  1070.          */
  1071.         if ( new_buffer != NULL )
  1072.         {
  1073.             /*
  1074.              * Reset pointeurs … 0: 
  1075.              */
  1076.             iorec -> ibufhd = 0;        /* Dernier car ‚crit en 0 */
  1077.             iorec -> ibuftl = 0;        /* Dernier car … lire en 0 */
  1078.     
  1079.             /*
  1080.              * Fixe nlle adresse: (Ancien buffer) 
  1081.              */
  1082.             iorec -> ibuf = new_buffer;
  1083.             /* 
  1084.              * Fixe nlle taille: 
  1085.              */
  1086.             iorec -> ibufsiz = newsize;
  1087.             
  1088.             /*
  1089.              * Reset pointeurs … 0: (Nouveau Buffer) 
  1090.              */
  1091.             iorec -> ibufhd = 0;        /* Dernier car ‚crit en 0 */
  1092.             iorec -> ibuftl = 0;        /* Dernier car … lire en 0 */
  1093.     
  1094.             /*
  1095.              * V‚rifie s'il faut lib‚rer l'ancien buffer: 
  1096.              */
  1097.             if( oldsize > defsize )
  1098.             {    /*
  1099.                  * Il faut lib‚rer l'ancien buffer: 
  1100.                  */
  1101.                 FREE( old_buffer );
  1102.             }
  1103.         }    
  1104.     }
  1105. }
  1106.  
  1107.  
  1108.  
  1109. /*
  1110.  * FlushRXBuffer(-)
  1111.  *
  1112.  * Purpose:
  1113.  * --------
  1114.  * Vide le tampon d'entr‚e d'un port s‚rie
  1115.  *
  1116.  * Algorythm:
  1117.  * ----------
  1118.  * Read until buf empty
  1119.  *
  1120.  * Notes:
  1121.  * ------
  1122.  * Ne JAMAIS utiliser lorsque le port est en mode connect‚
  1123.  * NEVER EVER use this when port is connected with remote terminal
  1124.  * Risque de perte d'infos importantes
  1125.  * Risk of important loss of information
  1126.  *
  1127.  * History:
  1128.  * --------
  1129.  * 19.11.94: fplanque: Created
  1130.  */
  1131. void    FlushRXBuffer( int n_device )    /* In: Port concern‚ */
  1132. {
  1133.     while( Bconstat ( n_device ) )
  1134.     {
  1135.         Bconin( n_device );    /* Lit 1 code/caractŠre */
  1136.     }
  1137. }
  1138.  
  1139.  
  1140. /*
  1141.  * Serial_FlushTX(-)
  1142.  *
  1143.  * Purpose:
  1144.  * --------
  1145.  * Vide le tampon de sortie d'un port s‚rie
  1146.  *
  1147.  * Algorythm:
  1148.  * ----------
  1149.  * 'hard' reset of buffer pointers!  Tail:=Head
  1150.  *
  1151.  * Notes:
  1152.  * ------
  1153.  * Use Sparingly!
  1154.  *
  1155.  * History:
  1156.  * --------
  1157.  * 29.03.95: fplanque: Created
  1158.  */
  1159. void    Serial_FlushTX( 
  1160.             int n_device )    /* In: Port concern‚ */
  1161. {
  1162.     IOREC    * pIorec = get_iorec( n_device );
  1163.     
  1164.     pIorec[ IOREC_OUT ] .ibuftl = pIorec[ IOREC_OUT ] .ibufhd;
  1165. }
  1166.  
  1167.  
  1168. /*
  1169.  * Serial_WaitTXEmpty(-)
  1170.  *
  1171.  * Purpose:
  1172.  * --------
  1173.  * Attend que le tampon de sortie d'un port s‚rie soit vide
  1174.  *
  1175.  * Algorythm:
  1176.  * ----------
  1177.  * 'hard' test of buffer pointers!  Tail==Head
  1178.  *
  1179.  * History:
  1180.  * --------
  1181.  * 08.04.95: fplanque: Created
  1182.  */
  1183. void    Serial_WaitTXEmpty( 
  1184.             int n_device )    /* In: Port concern‚ */
  1185. {
  1186.     IOREC    * pIorec = get_iorec( n_device );
  1187.     
  1188.     while( pIorec[ IOREC_OUT ] .ibuftl != pIorec[ IOREC_OUT ] .ibufhd )
  1189.         ;
  1190.  
  1191.     /*
  1192.      * Attend 5 msec suppl‚mentaires:
  1193.      */    
  1194.     wait( 5 );    
  1195. }
  1196.  
  1197.